contents
CPU는 2의 보수(two's complement) 라는 기법을 사용하여 뺄셈을 덧셈 문제로 영리하게 변환하여 계산합니다. 덧셈과 뺄셈을 위한 복잡한 회로를 각각 따로 두는 대신, CPU는 고도로 최적화된 덧셈 회로를 재사용하여 두 연산을 모두 수행하는데, 이것이 훨씬 더 효율적입니다.
즉, A - B를 계산하기 위해 CPU는 실제로 A + (-B)를 계산합니다.
문제: 음수 표현하기
먼저, CPU는 이진수(binary)로 음수를 표현할 방법이 필요합니다. 표준적인 방법은 2의 보수입니다. 이는 산술 연산을 단순화하는 우아한 시스템입니다.
음수의 2의 보수 표현을 찾는 방법은 다음과 같습니다(예: 8비트를 사용하여 -5 찾기).
- 양수의 이진수로 시작합니다.
- 숫자
5는 8비트 이진수로0000 0101입니다.
- 숫자
- 모든 비트를 뒤집습니다. 이를 "1의 보수"라고 합니다.
0000 0101은1111 1010이 됩니다.
- 1을 더합니다.
1111 1010 + 1은1111 1011이 됩니다.
따라서, 8비트 2의 보수 시스템에서 1111 1011은 -5의 이진 표현입니다.
계산: 덧셈으로 위장하기 🧠
이제 CPU가 7 - 5를 어떻게 계산하는지 봅시다. 실제로는 7 + (-5) 연산을 수행할 것입니다.
- 두 숫자의 이진수를 구합니다.
7은0000 0111입니다.-5(방금 계산한 값)는1111 1011입니다.
- 두 이진수를 더합니다.
0000 0111 (7)
+ 1111 1011 (-5)
-----------
1 0000 0010
- 올림수 비트(overflow bit)를 버립니다. 덧셈 결과가 9비트가 된 것을 주목하세요. 우리는 8비트 시스템에서 작업하고 있으므로, 가장 왼쪽 비트(9번째 비트)는 올림수 비트입니다. 2의 보수 뺄셈에서 이 올림수 비트는 그냥 버려집니다.
- 결과. 남은 8비트는
0000 0010이며, 이는 숫자2의 이진 표현입니다.
7 - 5 = 2라는 계산이 덧셈만으로 성공적으로 수행되었습니다.
하드웨어 구현 ⚙️
이 과정은 CPU의 특정 부분인 산술 논리 장치(ALU) 내부에서 처리됩니다.
ALU에는 이진수를 엄청난 속도로 더하도록 만들어진 가산기(adder) 라는 회로가 있습니다. CPU에 뺄셈을 지시하면 하드웨어 수준에서는 다음과 같은 일이 발생합니다.
- CPU의 제어 장치(Control Unit) 가 뺄셈 명령어를 받습니다.
- 두 숫자
A와B를 ALU로 보냅니다. - 제어 장치는 ALU에 "빼기" 연산을 수행하라고 지시합니다.
- ALU에는 전용 감산기(subtractor)가 없습니다. 대신, 숫자
B를 모든 비트를 뒤집는 간단한 NOT 게이트 회로로 보냅니다(2의 보수 첫 단계 수행). - 그런 다음
A와 뒤집힌B를 가산기 회로에 입력하고, 초기 "자리올림 입력(carry-in)" 비트를1로 설정합니다(이는 2의 보수의 "1 더하기" 단계를 달성). - 가산기 회로가 합계를 계산하면, 그 결과가 바로
A - B의 답이 됩니다.
이 기법을 사용함으로써 CPU는 별도의 복잡한 뺄셈 회로를 필요로 하지 않게 되어 칩의 공간을 절약하고 설계를 단순화할 수 있습니다.
references